<!doctype html><html lang=en dir=auto><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=robots content="index, follow"><title>Kotlin 技术月报 | 2024 年 12 月 | 北京 KUG</title><meta name=keywords content="技术月报"><meta name=description content="为了帮助社区的小伙伴们更好地了解 Kotlin 相关的最新动态，我们决定使用月报的形式，整理展示最近一个月的 Kotlin 技术动态。
月报的主要内容包括：整理展示最近一个月的最新技术动态，精选博客，精选视频以及社区活动等方面的信息。
最新动态 推出 klibs.io：探索 Kotlin Multiplatform 库的新方式 Kotlin Multiplatform¹ 正在迅速发展，生态系统不断扩大，仅在 2024 年，库的数量就增加了 35%。虽然可用库数远超往日，但找到适合您的用例和目标平台的库仍是一项挑战。
为此，JetBrains 推出了 klibs.io，这项新服务旨在提高查找 Kotlin Multiplatform 库的速度和简便性。
Klibs.io 是一项简单的 Web 服务，利用这项服务，您可以找到支持所选平台（JVM、Android JVM、Wasm、JS、Kotlin/Native）并且适用于特定目的的 Kotlin Multiplatform 库。网站会对 GitHub 和 Maven Central 中的数据编制索引，并使用 AI 生成的元数据增强搜索结果。它旨在通过提供与 KMP 相关的信息来降低评估库的难度。
Jetbrains 《2024 开发者生态系统现状报告》发布 https://www.jetbrains.com/zh-cn/lp/devecosystem-2024/
每年，Jetbrains 都会发布《开发者生态系统现状报告》，展现开发者的世界。这一次进行了精简，在一个网页上列出重点，汇集研究中最引人注目的洞察。如果您想深入了解，可以下载完整的原始数据。
基于全球 23,262 名开发者的回复，本报告将清晰透彻地展现庞大而多样的开发者群体。Jetbrains 的目标是分享开发者最关心的问题，从开发者所依赖的编程语言、工具和技术，到影响行业发展的关键问题。
今年，Jetbrains 将继续探索开发者在各个领域对 AI 的看法。剧透：对 AI 的恐惧似乎正在减少！Jetbrains 还将深入研究职业和就业趋势、领域多样性，甚至对业界最近大规模裁员的一些洞察。
Arrow 2.0 发布 Arrow 2.0 release
Arrow 是一个用于 Kotlin 类型化函数式编程的库,其目的是为 Kotlin 开发者提供一套丰富的工具和功能，以增强在 Kotlin 编程语言中进行函数式编程的能力和体验。"><meta name=author content="beijing-kug"><link rel=canonical href=https://beijing-kug.github.io/news/kotlin-news-2024-12/><link crossorigin=anonymous href=/assets/css/stylesheet.8f39c56ff9c568320c772f590aacdf29f8e8f17c0d9623de1a80621f8b933a96.css integrity="sha256-jznFb/nFaDIMdy9ZCqzfKfjo8XwNliPeGoBiH4uTOpY=" rel="preload stylesheet" as=style><script defer crossorigin=anonymous src=/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA=" onload=hljs.initHighlightingOnLoad()></script>
<link rel=icon href=https://beijing-kug.github.io/kug-logo.png><link rel=icon type=image/png sizes=16x16 href=https://beijing-kug.github.io/favicon-16x16.png><link rel=icon type=image/png sizes=32x32 href=https://beijing-kug.github.io/favicon-32x32.png><link rel=apple-touch-icon href=https://beijing-kug.github.io/apple-touch-icon.png><link rel=mask-icon href=https://beijing-kug.github.io/safari-pinned-tab.svg><meta name=theme-color content="#2e2e33"><meta name=msapplication-TileColor content="#2e2e33"><noscript><style>#theme-toggle,.top-link{display:none}</style><style>@media(prefers-color-scheme:dark){:root{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--theme)}.list:not(.dark)::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-thumb{border-color:var(--theme)}}</style></noscript><meta property="og:title" content="Kotlin 技术月报 | 2024 年 12 月"><meta property="og:description" content="为了帮助社区的小伙伴们更好地了解 Kotlin 相关的最新动态，我们决定使用月报的形式，整理展示最近一个月的 Kotlin 技术动态。
月报的主要内容包括：整理展示最近一个月的最新技术动态，精选博客，精选视频以及社区活动等方面的信息。
最新动态 推出 klibs.io：探索 Kotlin Multiplatform 库的新方式 Kotlin Multiplatform¹ 正在迅速发展，生态系统不断扩大，仅在 2024 年，库的数量就增加了 35%。虽然可用库数远超往日，但找到适合您的用例和目标平台的库仍是一项挑战。
为此，JetBrains 推出了 klibs.io，这项新服务旨在提高查找 Kotlin Multiplatform 库的速度和简便性。
Klibs.io 是一项简单的 Web 服务，利用这项服务，您可以找到支持所选平台（JVM、Android JVM、Wasm、JS、Kotlin/Native）并且适用于特定目的的 Kotlin Multiplatform 库。网站会对 GitHub 和 Maven Central 中的数据编制索引，并使用 AI 生成的元数据增强搜索结果。它旨在通过提供与 KMP 相关的信息来降低评估库的难度。
Jetbrains 《2024 开发者生态系统现状报告》发布 https://www.jetbrains.com/zh-cn/lp/devecosystem-2024/
每年，Jetbrains 都会发布《开发者生态系统现状报告》，展现开发者的世界。这一次进行了精简，在一个网页上列出重点，汇集研究中最引人注目的洞察。如果您想深入了解，可以下载完整的原始数据。
基于全球 23,262 名开发者的回复，本报告将清晰透彻地展现庞大而多样的开发者群体。Jetbrains 的目标是分享开发者最关心的问题，从开发者所依赖的编程语言、工具和技术，到影响行业发展的关键问题。
今年，Jetbrains 将继续探索开发者在各个领域对 AI 的看法。剧透：对 AI 的恐惧似乎正在减少！Jetbrains 还将深入研究职业和就业趋势、领域多样性，甚至对业界最近大规模裁员的一些洞察。
Arrow 2.0 发布 Arrow 2.0 release
Arrow 是一个用于 Kotlin 类型化函数式编程的库,其目的是为 Kotlin 开发者提供一套丰富的工具和功能，以增强在 Kotlin 编程语言中进行函数式编程的能力和体验。"><meta property="og:type" content="article"><meta property="og:url" content="https://beijing-kug.github.io/news/kotlin-news-2024-12/"><meta property="article:section" content="news"><meta property="article:published_time" content="2024-12-30T00:00:00+00:00"><meta property="article:modified_time" content="2024-12-30T00:00:00+00:00"><meta property="og:site_name" content="北京 KUG"><meta name=twitter:card content="summary"><meta name=twitter:title content="Kotlin 技术月报 | 2024 年 12 月"><meta name=twitter:description content="为了帮助社区的小伙伴们更好地了解 Kotlin 相关的最新动态，我们决定使用月报的形式，整理展示最近一个月的 Kotlin 技术动态。
月报的主要内容包括：整理展示最近一个月的最新技术动态，精选博客，精选视频以及社区活动等方面的信息。
最新动态 推出 klibs.io：探索 Kotlin Multiplatform 库的新方式 Kotlin Multiplatform¹ 正在迅速发展，生态系统不断扩大，仅在 2024 年，库的数量就增加了 35%。虽然可用库数远超往日，但找到适合您的用例和目标平台的库仍是一项挑战。
为此，JetBrains 推出了 klibs.io，这项新服务旨在提高查找 Kotlin Multiplatform 库的速度和简便性。
Klibs.io 是一项简单的 Web 服务，利用这项服务，您可以找到支持所选平台（JVM、Android JVM、Wasm、JS、Kotlin/Native）并且适用于特定目的的 Kotlin Multiplatform 库。网站会对 GitHub 和 Maven Central 中的数据编制索引，并使用 AI 生成的元数据增强搜索结果。它旨在通过提供与 KMP 相关的信息来降低评估库的难度。
Jetbrains 《2024 开发者生态系统现状报告》发布 https://www.jetbrains.com/zh-cn/lp/devecosystem-2024/
每年，Jetbrains 都会发布《开发者生态系统现状报告》，展现开发者的世界。这一次进行了精简，在一个网页上列出重点，汇集研究中最引人注目的洞察。如果您想深入了解，可以下载完整的原始数据。
基于全球 23,262 名开发者的回复，本报告将清晰透彻地展现庞大而多样的开发者群体。Jetbrains 的目标是分享开发者最关心的问题，从开发者所依赖的编程语言、工具和技术，到影响行业发展的关键问题。
今年，Jetbrains 将继续探索开发者在各个领域对 AI 的看法。剧透：对 AI 的恐惧似乎正在减少！Jetbrains 还将深入研究职业和就业趋势、领域多样性，甚至对业界最近大规模裁员的一些洞察。
Arrow 2.0 发布 Arrow 2.0 release
Arrow 是一个用于 Kotlin 类型化函数式编程的库,其目的是为 Kotlin 开发者提供一套丰富的工具和功能，以增强在 Kotlin 编程语言中进行函数式编程的能力和体验。"><script type=application/ld+json>{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"News","item":"https://beijing-kug.github.io/news/"},{"@type":"ListItem","position":2,"name":"Kotlin 技术月报 | 2024 年 12 月","item":"https://beijing-kug.github.io/news/kotlin-news-2024-12/"}]}</script><script type=application/ld+json>{"@context":"https://schema.org","@type":"BlogPosting","headline":"Kotlin 技术月报 | 2024 年 12 月","name":"Kotlin 技术月报 | 2024 年 12 月","description":"为了帮助社区的小伙伴们更好地了解 Kotlin 相关的最新动态，我们决定使用月报的形式，整理展示最近一个月的 Kotlin 技术动态。\n月报的主要内容包括：整理展示最近一个月的最新技术动态，精选博客，精选视频以及社区活动等方面的信息。\n最新动态 推出 klibs.io：探索 Kotlin Multiplatform 库的新方式 Kotlin Multiplatform¹ 正在迅速发展，生态系统不断扩大，仅在 2024 年，库的数量就增加了 35%。虽然可用库数远超往日，但找到适合您的用例和目标平台的库仍是一项挑战。\n为此，JetBrains 推出了 klibs.io，这项新服务旨在提高查找 Kotlin Multiplatform 库的速度和简便性。\nKlibs.io 是一项简单的 Web 服务，利用这项服务，您可以找到支持所选平台（JVM、Android JVM、Wasm、JS、Kotlin/Native）并且适用于特定目的的 Kotlin Multiplatform 库。网站会对 GitHub 和 Maven Central 中的数据编制索引，并使用 AI 生成的元数据增强搜索结果。它旨在通过提供与 KMP 相关的信息来降低评估库的难度。\nJetbrains 《2024 开发者生态系统现状报告》发布 https://www.jetbrains.com/zh-cn/lp/devecosystem-2024/\n每年，Jetbrains 都会发布《开发者生态系统现状报告》，展现开发者的世界。这一次进行了精简，在一个网页上列出重点，汇集研究中最引人注目的洞察。如果您想深入了解，可以下载完整的原始数据。\n基于全球 23,262 名开发者的回复，本报告将清晰透彻地展现庞大而多样的开发者群体。Jetbrains 的目标是分享开发者最关心的问题，从开发者所依赖的编程语言、工具和技术，到影响行业发展的关键问题。\n今年，Jetbrains 将继续探索开发者在各个领域对 AI 的看法。剧透：对 AI 的恐惧似乎正在减少！Jetbrains 还将深入研究职业和就业趋势、领域多样性，甚至对业界最近大规模裁员的一些洞察。\nArrow 2.0 发布 Arrow 2.0 release\nArrow 是一个用于 Kotlin 类型化函数式编程的库,其目的是为 Kotlin 开发者提供一套丰富的工具和功能，以增强在 Kotlin 编程语言中进行函数式编程的能力和体验。","keywords":["技术月报"],"articleBody":"为了帮助社区的小伙伴们更好地了解 Kotlin 相关的最新动态，我们决定使用月报的形式，整理展示最近一个月的 Kotlin 技术动态。\n月报的主要内容包括：整理展示最近一个月的最新技术动态，精选博客，精选视频以及社区活动等方面的信息。\n最新动态 推出 klibs.io：探索 Kotlin Multiplatform 库的新方式 Kotlin Multiplatform¹ 正在迅速发展，生态系统不断扩大，仅在 2024 年，库的数量就增加了 35%。虽然可用库数远超往日，但找到适合您的用例和目标平台的库仍是一项挑战。\n为此，JetBrains 推出了 klibs.io，这项新服务旨在提高查找 Kotlin Multiplatform 库的速度和简便性。\nKlibs.io 是一项简单的 Web 服务，利用这项服务，您可以找到支持所选平台（JVM、Android JVM、Wasm、JS、Kotlin/Native）并且适用于特定目的的 Kotlin Multiplatform 库。网站会对 GitHub 和 Maven Central 中的数据编制索引，并使用 AI 生成的元数据增强搜索结果。它旨在通过提供与 KMP 相关的信息来降低评估库的难度。\nJetbrains 《2024 开发者生态系统现状报告》发布 https://www.jetbrains.com/zh-cn/lp/devecosystem-2024/\n每年，Jetbrains 都会发布《开发者生态系统现状报告》，展现开发者的世界。这一次进行了精简，在一个网页上列出重点，汇集研究中最引人注目的洞察。如果您想深入了解，可以下载完整的原始数据。\n基于全球 23,262 名开发者的回复，本报告将清晰透彻地展现庞大而多样的开发者群体。Jetbrains 的目标是分享开发者最关心的问题，从开发者所依赖的编程语言、工具和技术，到影响行业发展的关键问题。\n今年，Jetbrains 将继续探索开发者在各个领域对 AI 的看法。剧透：对 AI 的恐惧似乎正在减少！Jetbrains 还将深入研究职业和就业趋势、领域多样性，甚至对业界最近大规模裁员的一些洞察。\nArrow 2.0 发布 Arrow 2.0 release\nArrow 是一个用于 Kotlin 类型化函数式编程的库,其目的是为 Kotlin 开发者提供一套丰富的工具和功能，以增强在 Kotlin 编程语言中进行函数式编程的能力和体验。\nArrow 2.0 版本目前已发布。这个版本是使用新的 K2 编译器构建的，这使其能够支持更广泛的平台，包括 WebAssembly。从现在开始，Arrow 将为 Kotlin 支持的每个平台提供构件。除了稳定化和一般错误修复之外，这个版本的主题是改进 Arrow 库提供的领域特定语言（DSL），其目标是使开发人员能够编写更简洁易读的代码。\nKoin 计划发布 IDE 插件 Koin 是一个轻量级的依赖注入（Dependency Injection，DI）框架。对于一个依赖注入框架来说，编译时的检查是非常重要的。为了提高开发者的开发效率，Koin 团队更进一步，计划于 2025 年 Q1 发布一个 IDE 插件，用于检查 Koin 模块的正确性。\n与传统的在编译过程中发生的编译安全不同，IDE 插件会在你编写代码时实时分析 Koin 配置。\nKoin IDE 插件将执行静态代码分析，在诸如循环引用或缺少声明等问题变成运行时错误之前尽早识别它们。这种积极主动的方法将通过从源头上防止配置问题，而不是等到在编译或构建时出现问题，从而简化你的工作流程。\n通过立即集成到你的开发工作流程中，IDE 插件不仅仅是在检查代码而是从源头上防止配置错误。与其他依赖注入框架相比，这种方法可以减少等待编译的时间，提高开发效率。\n精选博客 Kotlin Multiplatform 的春天， klibs.io 发布，还有官方支持鸿蒙的想法 Kotlin Multiplatform 这些年发展迅速，其中最明显的就是 KMP 生态在不断扩大，仅在 2024 年一年里，库的数量就增加了 35%。为了帮助开发者更好地找到适合自己的库，JetBrains 推出了 klibs.io，这项新服务旨在提高查找 Kotlin Multiplatform 库的速度和简便性。\n同时近期 Kotlin 编译组的 lead 表示，他们也在研究如何在 KMP 中支持 Harmony0S。而官方的计划是，可以通过重新使用 Kotlin/JS 编译器，直接生成 ArkTS (而不是JS)，从他的角度看，现在都通过 Kotlin/Native 的实现并不合适，因为在 Kotlin/Native 实现中，会有两个运行时和两个独立的垃圾回收器。\n而在 Kotlin 官方的角度，这样做可以重新使用 Kotlin/JS 生态系统中已经拥有的 TypeScript 互操作性，另一个好处是将重新使用 HarmonyOS 工具链的所有其他部分，包括运行时，因此调用 HarmonyOS 的 APl 不会有任何性能损失。\n一文看懂 Jetapck Compose 布局流程 Compose 绘制生命周期为三个阶段：\nComposition/组合：Composable 源码经过运行后生成 LayoutNode 的节点树，这棵树被称为 Composition。 Layout/布局：对节点树深度遍历测量子节点的尺寸，并将其在父容器内摆放到合适的位置。 Drawing/绘制：基于布局后拿到的尺寸和位置信息，绘制上屏。 我们与 Android 经典视图系统的生命周期（Measure，Layout，Drawing）做一个对比：组合是 Compose 的特有阶段，是其能够通过函数调用实现声明式 UI 的核心，具体可见作者的其他文章，而绘制阶段与传统视图大同小异，都是通过 Android Cavas API ，底层调用 skia 实现，本文也不做讨论。\n本文讨论的重点是布局阶段。Compose 的布局把 Measure 也了囊括进来，相对于 Android View 有相似性，但也有其独有的特点和优势。\n从零实现一个 KMP 插桩框架: EzHook Kotlin Multiplatform近年来逐渐崭露头角，已成为备受关注的跨平台开发方案。它支持代码在 Android、iOS、Web、Destop 等多个平台之间复用，能够大幅提升开发效率与需求的多端一致性。并且随着鸿蒙 Next 的发布，越来越多公司开始着手适配 KMP 以满足未来移动端跨平台开发的需求，由此可见 KMP的发展潜力不可小觑。\n然而，在将 KMP 应用到实际项目中时发现缺少一个关键能力——「代码插桩」。这一能力对于修改第三方库、面向切片编程（AOP）以及构建业务框架等场景至关重要。在 Android 平台上，我们可以基于 Transform 实现自定义的字节码转换，并且社区也提供了丰富的 AOP 框架（如 Lancet）。\n但目前还没有一款基于 KMP 的类 Transform 能力与对应的 AOP 框架，本文探索了 KMP 平台上类 Transform 能力，并基于该能力开发一款适用于 KMP 的 AOP 框架——EzHook。\nKotlin/JVM 编译流程浅析 编译器一般分为前端和后端两部分，前端负责词法分析、语法分析、语义分析、中间代码生成等工作，后端负责中间代码优化、目标代码生成等工作。Kotlin 的编译器其实也是由这些部分组成的，本文基于 Kotlin 2.1 版本源码，按这几个部分介绍了 Kotlin 的编译流程。同时讲解了 Kotlin 编译器的调试方法，对比了 K1 和 K2 版本在各阶段的差异，分析了 K2 比 K1 快的原因。\n社区活动 活动 ｜12 月 14 - 15 日，2024 Kotlin 中文开发者大会 —— 随处可见的 KMP Kotlin 中文开发者大会是由 JetBrains 团队与中文 Kotlin User Group 合作举办的免费线上直播活动，自 2021 年举办以来，大会成为 Kotlin 中文开发者发表、学习、交流的最佳平台。延续这个传统，今年于 12 月 14 日（六）及 12 月 15 日（日）两天进行线上直播。\n本次大会以「随处可见的 KMP」为主题，汇聚多位技术专家，分享他们在不同场景使用 Kotlin 的宝贵经验。内容涵盖多平台开发策略、鸿蒙新平台的适配、面向 AI 时代的解决方案、SDK 及 ORM 的开发、以及后端应用等。此外，KUG 技术社区的小伙伴们还将带来 KotlinConf’24 丹麦哥本哈根现场的精彩见闻，让未能亲临现场的听众也能感受到大会的热烈氛围。如此丰富多元的主题，机会难得，不容错过！\n","wordCount":"291","inLanguage":"en","datePublished":"2024-12-30T00:00:00Z","dateModified":"2024-12-30T00:00:00Z","author":{"@type":"Person","name":"beijing-kug"},"mainEntityOfPage":{"@type":"WebPage","@id":"https://beijing-kug.github.io/news/kotlin-news-2024-12/"},"publisher":{"@type":"Organization","name":"北京 KUG","logo":{"@type":"ImageObject","url":"https://beijing-kug.github.io/kug-logo.png"}}}</script></head><body id=top><script>localStorage.getItem("pref-theme")==="dark"?document.body.classList.add("dark"):localStorage.getItem("pref-theme")==="light"?document.body.classList.remove("dark"):window.matchMedia("(prefers-color-scheme: dark)").matches&&document.body.classList.add("dark")</script><header class=header><nav class=nav><div class=logo><a href=https://beijing-kug.github.io/ accesskey=h title="北京 KUG (Alt + H)">北京 KUG</a><div class=logo-switches><button id=theme-toggle accesskey=t title="(Alt + T)"><svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg><svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg></button></div></div><ul id=menu><li><a href=https://beijing-kug.github.io/events/ title=分享会><span>分享会</span></a></li><li><a href=https://mp.weixin.qq.com/s/GNlbZ6xpCGB1EGML_W4kOg title="加入 KUG"><span>加入 KUG</span></a></li><li><a href=https://www.kotlincn.net/ title=中文文档><span>中文文档</span></a></li><li><a href=https://beijing-kug.github.io/news/ title=技术月报><span>技术月报</span></a></li></ul></nav></header><main class=main><article class=post-single><header class=post-header><div class=breadcrumbs><a href=https://beijing-kug.github.io/>Home</a>&nbsp;»&nbsp;<a href=https://beijing-kug.github.io/news/>News</a></div><h1 class=post-title>Kotlin 技术月报 | 2024 年 12 月</h1><div class=post-meta><span title='2024-12-30 00:00:00 +0000 UTC'>December 30, 2024</span>&nbsp;·&nbsp;beijing-kug</div></header><div class=post-content><p>为了帮助社区的小伙伴们更好地了解 Kotlin 相关的最新动态，我们决定使用月报的形式，整理展示最近一个月的 Kotlin 技术动态。</p><p>月报的主要内容包括：整理展示最近一个月的最新技术动态，精选博客，精选视频以及社区活动等方面的信息。</p><h2 id=最新动态>最新动态<a hidden class=anchor aria-hidden=true href=#最新动态>#</a></h2><h3 id=推出-klibsio探索-kotlin-multiplatform-库的新方式httpsmpweixinqqcomst3qtxrwumppl5cqkmkjxtw><a href=https://mp.weixin.qq.com/s/T3qtxrwuMPpL5cQKmKJXtw>推出 klibs.io：探索 Kotlin Multiplatform 库的新方式</a><a hidden class=anchor aria-hidden=true href=#推出-klibsio探索-kotlin-multiplatform-库的新方式httpsmpweixinqqcomst3qtxrwumppl5cqkmkjxtw>#</a></h3><p>Kotlin Multiplatform¹ 正在迅速发展，生态系统不断扩大，仅在 2024 年，库的数量就增加了 35%。虽然可用库数远超往日，但找到适合您的用例和目标平台的库仍是一项挑战。</p><p>为此，JetBrains 推出了 klibs.io，这项新服务旨在提高查找 Kotlin Multiplatform 库的速度和简便性。</p><p>Klibs.io 是一项简单的 Web 服务，利用这项服务，您可以找到支持所选平台（JVM、Android JVM、Wasm、JS、Kotlin/Native）并且适用于特定目的的 Kotlin Multiplatform 库。网站会对 GitHub 和 Maven Central 中的数据编制索引，并使用 AI 生成的元数据增强搜索结果。它旨在通过提供与 KMP 相关的信息来降低评估库的难度。</p><p><img loading=lazy src=https://raw.gitmirror.com/RicardoJiang/resource/refs/heads/main/2024/december/p9.webp alt></p><h3 id=jetbrains-2024-开发者生态系统现状报告发布>Jetbrains 《2024 开发者生态系统现状报告》发布<a hidden class=anchor aria-hidden=true href=#jetbrains-2024-开发者生态系统现状报告发布>#</a></h3><p><a href=https://www.jetbrains.com/zh-cn/lp/devecosystem-2024/>https://www.jetbrains.com/zh-cn/lp/devecosystem-2024/</a></p><p>每年，Jetbrains 都会发布《开发者生态系统现状报告》，展现开发者的世界。这一次进行了精简，在一个网页上列出重点，汇集研究中最引人注目的洞察。如果您想深入了解，可以下载完整的原始数据。</p><p>基于全球 23,262 名开发者的回复，本报告将清晰透彻地展现庞大而多样的开发者群体。Jetbrains 的目标是分享开发者最关心的问题，从开发者所依赖的编程语言、工具和技术，到影响行业发展的关键问题。</p><p>今年，Jetbrains 将继续探索开发者在各个领域对 AI 的看法。剧透：对 AI 的恐惧似乎正在减少！Jetbrains 还将深入研究职业和就业趋势、领域多样性，甚至对业界最近大规模裁员的一些洞察。</p><p><img loading=lazy src=https://raw.gitmirror.com/RicardoJiang/resource/refs/heads/main/2024/december/p10.jpg alt></p><h3 id=arrow-20-发布>Arrow 2.0 发布<a hidden class=anchor aria-hidden=true href=#arrow-20-发布>#</a></h3><p><a href=https://arrow-kt.io/community/blog/2024/12/05/arrow-2-0/>Arrow 2.0 release</a></p><p>Arrow 是一个用于 Kotlin 类型化函数式编程的库,其目的是为 Kotlin 开发者提供一套丰富的工具和功能，以增强在 Kotlin 编程语言中进行函数式编程的能力和体验。</p><p>Arrow 2.0 版本目前已发布。这个版本是使用新的 K2 编译器构建的，这使其能够支持更广泛的平台，包括 WebAssembly。从现在开始，Arrow 将为 Kotlin 支持的每个平台提供构件。除了稳定化和一般错误修复之外，这个版本的主题是改进 Arrow 库提供的领域特定语言（DSL），其目标是使开发人员能够编写更简洁易读的代码。</p><h3 id=koin-计划发布-ide-插件>Koin 计划发布 IDE 插件<a hidden class=anchor aria-hidden=true href=#koin-计划发布-ide-插件>#</a></h3><p>Koin 是一个轻量级的依赖注入（Dependency Injection，DI）框架。对于一个依赖注入框架来说，编译时的检查是非常重要的。为了提高开发者的开发效率，Koin 团队更进一步，计划于 2025 年 Q1 发布一个 IDE 插件，用于检查 Koin 模块的正确性。</p><p>与传统的在编译过程中发生的编译安全不同，IDE 插件会在你编写代码时实时分析 Koin 配置。</p><p>Koin IDE 插件将执行静态代码分析，在诸如循环引用或缺少声明等问题变成运行时错误之前尽早识别它们。这种积极主动的方法将通过从源头上防止配置问题，而不是等到在编译或构建时出现问题，从而简化你的工作流程。</p><p>通过立即集成到你的开发工作流程中，IDE 插件不仅仅是在检查代码而是从源头上防止配置错误。与其他依赖注入框架相比，这种方法可以减少等待编译的时间，提高开发效率。</p><p><img loading=lazy src=https://raw.gitmirror.com/RicardoJiang/resource/refs/heads/main/2024/december/p11.webp alt></p><h2 id=精选博客>精选博客<a hidden class=anchor aria-hidden=true href=#精选博客>#</a></h2><h3 id=kotlin-multiplatform-的春天-klibsio-发布还有官方支持鸿蒙的想法httpsjuejincnpost7449965819360411685><a href=https://juejin.cn/post/7449965819360411685>Kotlin Multiplatform 的春天， klibs.io 发布，还有官方支持鸿蒙的想法</a><a hidden class=anchor aria-hidden=true href=#kotlin-multiplatform-的春天-klibsio-发布还有官方支持鸿蒙的想法httpsjuejincnpost7449965819360411685>#</a></h3><p>Kotlin Multiplatform 这些年发展迅速，其中最明显的就是 KMP 生态在不断扩大，仅在 2024 年一年里，库的数量就增加了 35%。为了帮助开发者更好地找到适合自己的库，JetBrains 推出了 klibs.io，这项新服务旨在提高查找 Kotlin Multiplatform 库的速度和简便性。</p><p>同时近期 Kotlin 编译组的 lead 表示，他们也在研究如何在 KMP 中支持 Harmony0S。而官方的计划是，可以通过重新使用 Kotlin/JS 编译器，直接生成 ArkTS (而不是JS)，从他的角度看，现在都通过 Kotlin/Native 的实现并不合适，因为在 Kotlin/Native 实现中，会有两个运行时和两个独立的垃圾回收器。</p><p>而在 Kotlin 官方的角度，这样做可以重新使用 Kotlin/JS 生态系统中已经拥有的 TypeScript 互操作性，另一个好处是将重新使用 HarmonyOS 工具链的所有其他部分，包括运行时，因此调用 HarmonyOS 的 APl 不会有任何性能损失。</p><p><img loading=lazy src=https://raw.gitmirror.com/RicardoJiang/resource/refs/heads/main/2024/december/p12.webp alt></p><h3 id=一文看懂-jetapck-compose-布局流程httpsjuejincnpost7446007995417395234><a href=https://juejin.cn/post/7446007995417395234>一文看懂 Jetapck Compose 布局流程</a><a hidden class=anchor aria-hidden=true href=#一文看懂-jetapck-compose-布局流程httpsjuejincnpost7446007995417395234>#</a></h3><p>Compose 绘制生命周期为三个阶段：</p><ul><li>Composition/组合：Composable 源码经过运行后生成 LayoutNode 的节点树，这棵树被称为 Composition。</li><li>Layout/布局：对节点树深度遍历测量子节点的尺寸，并将其在父容器内摆放到合适的位置。</li><li>Drawing/绘制：基于布局后拿到的尺寸和位置信息，绘制上屏。</li></ul><p>我们与 Android 经典视图系统的生命周期（Measure，Layout，Drawing）做一个对比：组合是 Compose 的特有阶段，是其能够通过函数调用实现声明式 UI 的核心，具体可见作者的其他文章，而绘制阶段与传统视图大同小异，都是通过 Android Cavas API ，底层调用 skia 实现，本文也不做讨论。</p><p>本文讨论的重点是布局阶段。Compose 的布局把 Measure 也了囊括进来，相对于 Android View 有相似性，但也有其独有的特点和优势。</p><p><img loading=lazy src=https://raw.gitmirror.com/RicardoJiang/resource/refs/heads/main/2024/december/p14.webp alt></p><h3 id=从零实现一个-kmp-插桩框架-ezhookhttpsjuejincnpost7445861251420487706><a href=https://juejin.cn/post/7445861251420487706>从零实现一个 KMP 插桩框架: EzHook</a><a hidden class=anchor aria-hidden=true href=#从零实现一个-kmp-插桩框架-ezhookhttpsjuejincnpost7445861251420487706>#</a></h3><p>Kotlin Multiplatform近年来逐渐崭露头角，已成为备受关注的跨平台开发方案。它支持代码在 Android、iOS、Web、Destop 等多个平台之间复用，能够大幅提升开发效率与需求的多端一致性。并且随着鸿蒙 Next 的发布，越来越多公司开始着手适配 KMP 以满足未来移动端跨平台开发的需求，由此可见 KMP的发展潜力不可小觑。</p><p>然而，在将 KMP 应用到实际项目中时发现缺少一个关键能力——「代码插桩」。这一能力对于修改第三方库、面向切片编程（AOP）以及构建业务框架等场景至关重要。在 Android 平台上，我们可以基于 Transform 实现自定义的字节码转换，并且社区也提供了丰富的 AOP 框架（如 Lancet）。</p><p>但目前还没有一款基于 KMP 的类 Transform 能力与对应的 AOP 框架，本文探索了 KMP 平台上类 Transform 能力，并基于该能力开发一款适用于 KMP 的 AOP 框架——EzHook。</p><p><img loading=lazy src=https://raw.gitmirror.com/RicardoJiang/resource/refs/heads/main/2024/december/p15.webp alt></p><h3 id=kotlinjvm-编译流程浅析httpsjuejincnpost7451227088571351059><a href=https://juejin.cn/post/7451227088571351059>Kotlin/JVM 编译流程浅析</a><a hidden class=anchor aria-hidden=true href=#kotlinjvm-编译流程浅析httpsjuejincnpost7451227088571351059>#</a></h3><p>编译器一般分为前端和后端两部分，前端负责词法分析、语法分析、语义分析、中间代码生成等工作，后端负责中间代码优化、目标代码生成等工作。Kotlin 的编译器其实也是由这些部分组成的，本文基于 Kotlin 2.1 版本源码，按这几个部分介绍了 Kotlin 的编译流程。同时讲解了 Kotlin 编译器的调试方法，对比了 K1 和 K2 版本在各阶段的差异，分析了 K2 比 K1 快的原因。</p><p><img loading=lazy src=https://raw.gitmirror.com/RicardoJiang/resource/refs/heads/main/2024/december/p16.webp alt></p><h2 id=社区活动>社区活动<a hidden class=anchor aria-hidden=true href=#社区活动>#</a></h2><h3 id=活动-12-月-14---15-日2024-kotlin-中文开发者大会--随处可见的-kmphttpsmpweixinqqcomspuecd70nc17s0ne1s0m-1a><a href=https://mp.weixin.qq.com/s/puECD70Nc17S0nE1s0m-1A>活动 ｜12 月 14 - 15 日，2024 Kotlin 中文开发者大会 —— 随处可见的 KMP</a><a hidden class=anchor aria-hidden=true href=#活动-12-月-14---15-日2024-kotlin-中文开发者大会--随处可见的-kmphttpsmpweixinqqcomspuecd70nc17s0ne1s0m-1a>#</a></h3><p>Kotlin 中文开发者大会是由 JetBrains 团队与中文 Kotlin User Group 合作举办的免费线上直播活动，自 2021 年举办以来，大会成为 Kotlin 中文开发者发表、学习、交流的最佳平台。延续这个传统，今年于 12 月 14 日（六）及 12 月 15 日（日）两天进行线上直播。</p><p>本次大会以「随处可见的 KMP」为主题，汇聚多位技术专家，分享他们在不同场景使用 Kotlin 的宝贵经验。内容涵盖多平台开发策略、鸿蒙新平台的适配、面向 AI 时代的解决方案、SDK 及 ORM 的开发、以及后端应用等。此外，KUG 技术社区的小伙伴们还将带来 KotlinConf’24 丹麦哥本哈根现场的精彩见闻，让未能亲临现场的听众也能感受到大会的热烈氛围。如此丰富多元的主题，机会难得，不容错过！</p><p><img loading=lazy src=https://raw.gitmirror.com/RicardoJiang/resource/refs/heads/main/2024/december/p17.png alt></p></div><footer class=post-footer><ul class=post-tags><li><a href=https://beijing-kug.github.io/tags/%E6%8A%80%E6%9C%AF%E6%9C%88%E6%8A%A5/>技术月报</a></li></ul><nav class=paginav><a class=prev href=https://beijing-kug.github.io/news/kotlin-news-2025-01/><span class=title>« Prev</span><br><span>Kotlin 技术月报 | 2025 年 1 月</span></a>
<a class=next href=https://beijing-kug.github.io/news/kotlin-news-2024-11/><span class=title>Next »</span><br><span>Kotlin 技术月报 | 2024 年 11 月</span></a></nav><div class=share-buttons><a target=_blank rel="noopener noreferrer" aria-label="share Kotlin 技术月报 | 2024 年 12 月 on twitter" href="https://twitter.com/intent/tweet/?text=Kotlin%20%e6%8a%80%e6%9c%af%e6%9c%88%e6%8a%a5%20%7c%202024%20%e5%b9%b4%2012%20%e6%9c%88&amp;url=https%3a%2f%2fbeijing-kug.github.io%2fnews%2fkotlin-news-2024-12%2f&amp;hashtags=%e6%8a%80%e6%9c%af%e6%9c%88%e6%8a%a5"><svg viewBox="0 0 512 512"><path d="M449.446.0C483.971.0 512 28.03 512 62.554v386.892C512 483.97 483.97 512 449.446 512H62.554c-34.524.0-62.554-28.03-62.554-62.554V62.554c0-34.524 28.029-62.554 62.554-62.554h386.892zM195.519 424.544c135.939.0 210.268-112.643 210.268-210.268.0-3.218.0-6.437-.153-9.502 14.406-10.421 26.973-23.448 36.935-38.314-13.18 5.824-27.433 9.809-42.452 11.648 15.326-9.196 26.973-23.602 32.49-40.92-14.252 8.429-30.038 14.56-46.896 17.931-13.487-14.406-32.644-23.295-53.946-23.295-40.767.0-73.87 33.104-73.87 73.87.0 5.824.613 11.494 1.992 16.858-61.456-3.065-115.862-32.49-152.337-77.241-6.284 10.881-9.962 23.601-9.962 37.088.0 25.594 13.027 48.276 32.95 61.456-12.107-.307-23.448-3.678-33.41-9.196v.92c0 35.862 25.441 65.594 59.311 72.49-6.13 1.686-12.72 2.606-19.464 2.606-4.751.0-9.348-.46-13.946-1.38 9.349 29.426 36.628 50.728 68.965 51.341-25.287 19.771-57.164 31.571-91.8 31.571-5.977.0-11.801-.306-17.625-1.073 32.337 21.15 71.264 33.41 112.95 33.41z"/></svg></a><a target=_blank rel="noopener noreferrer" aria-label="share Kotlin 技术月报 | 2024 年 12 月 on linkedin" href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https%3a%2f%2fbeijing-kug.github.io%2fnews%2fkotlin-news-2024-12%2f&amp;title=Kotlin%20%e6%8a%80%e6%9c%af%e6%9c%88%e6%8a%a5%20%7c%202024%20%e5%b9%b4%2012%20%e6%9c%88&amp;summary=Kotlin%20%e6%8a%80%e6%9c%af%e6%9c%88%e6%8a%a5%20%7c%202024%20%e5%b9%b4%2012%20%e6%9c%88&amp;source=https%3a%2f%2fbeijing-kug.github.io%2fnews%2fkotlin-news-2024-12%2f"><svg viewBox="0 0 512 512"><path d="M449.446.0C483.971.0 512 28.03 512 62.554v386.892C512 483.97 483.97 512 449.446 512H62.554c-34.524.0-62.554-28.03-62.554-62.554V62.554c0-34.524 28.029-62.554 62.554-62.554h386.892zM160.461 423.278V197.561h-75.04v225.717h75.04zm270.539.0V293.839c0-69.333-37.018-101.586-86.381-101.586-39.804.0-57.634 21.891-67.617 37.266v-31.958h-75.021c.995 21.181.0 225.717.0 225.717h75.02V297.222c0-6.748.486-13.492 2.474-18.315 5.414-13.475 17.767-27.434 38.494-27.434 27.135.0 38.007 20.707 38.007 51.037v120.768H431zM123.448 88.722C97.774 88.722 81 105.601 81 127.724c0 21.658 16.264 39.002 41.455 39.002h.484c26.165.0 42.452-17.344 42.452-39.002-.485-22.092-16.241-38.954-41.943-39.002z"/></svg></a><a target=_blank rel="noopener noreferrer" aria-label="share Kotlin 技术月报 | 2024 年 12 月 on reddit" href="https://reddit.com/submit?url=https%3a%2f%2fbeijing-kug.github.io%2fnews%2fkotlin-news-2024-12%2f&title=Kotlin%20%e6%8a%80%e6%9c%af%e6%9c%88%e6%8a%a5%20%7c%202024%20%e5%b9%b4%2012%20%e6%9c%88"><svg viewBox="0 0 512 512"><path d="M449.446.0C483.971.0 512 28.03 512 62.554v386.892C512 483.97 483.97 512 449.446 512H62.554c-34.524.0-62.554-28.03-62.554-62.554V62.554c0-34.524 28.029-62.554 62.554-62.554h386.892zM446 265.638c0-22.964-18.616-41.58-41.58-41.58-11.211.0-21.361 4.457-28.841 11.666-28.424-20.508-67.586-33.757-111.204-35.278l18.941-89.121 61.884 13.157c.756 15.734 13.642 28.29 29.56 28.29 16.407.0 29.706-13.299 29.706-29.701.0-16.403-13.299-29.702-29.706-29.702-11.666.0-21.657 6.792-26.515 16.578l-69.105-14.69c-1.922-.418-3.939-.042-5.585 1.036-1.658 1.073-2.811 2.761-3.224 4.686l-21.152 99.438c-44.258 1.228-84.046 14.494-112.837 35.232-7.468-7.164-17.589-11.591-28.757-11.591-22.965.0-41.585 18.616-41.585 41.58.0 16.896 10.095 31.41 24.568 37.918-.639 4.135-.99 8.328-.99 12.576.0 63.977 74.469 115.836 166.33 115.836s166.334-51.859 166.334-115.836c0-4.218-.347-8.387-.977-12.493 14.564-6.47 24.735-21.034 24.735-38.001zM326.526 373.831c-20.27 20.241-59.115 21.816-70.534 21.816-11.428.0-50.277-1.575-70.522-21.82-3.007-3.008-3.007-7.882.0-10.889 3.003-2.999 7.882-3.003 10.885.0 12.777 12.781 40.11 17.317 59.637 17.317 19.522.0 46.86-4.536 59.657-17.321 3.016-2.999 7.886-2.995 10.885.008 3.008 3.011 3.003 7.882-.008 10.889zm-5.23-48.781c-16.373.0-29.701-13.324-29.701-29.698.0-16.381 13.328-29.714 29.701-29.714 16.378.0 29.706 13.333 29.706 29.714.0 16.374-13.328 29.698-29.706 29.698zM160.91 295.348c0-16.381 13.328-29.71 29.714-29.71 16.369.0 29.689 13.329 29.689 29.71.0 16.373-13.32 29.693-29.689 29.693-16.386.0-29.714-13.32-29.714-29.693z"/></svg></a><a target=_blank rel="noopener noreferrer" aria-label="share Kotlin 技术月报 | 2024 年 12 月 on facebook" href="https://facebook.com/sharer/sharer.php?u=https%3a%2f%2fbeijing-kug.github.io%2fnews%2fkotlin-news-2024-12%2f"><svg viewBox="0 0 512 512"><path d="M449.446.0C483.971.0 512 28.03 512 62.554v386.892C512 483.97 483.97 512 449.446 512H342.978V319.085h66.6l12.672-82.621h-79.272v-53.617c0-22.603 11.073-44.636 46.58-44.636H425.6v-70.34s-32.71-5.582-63.982-5.582c-65.288.0-107.96 39.569-107.96 111.204v62.971h-72.573v82.621h72.573V512h-191.104c-34.524.0-62.554-28.03-62.554-62.554V62.554c0-34.524 28.029-62.554 62.554-62.554h386.892z"/></svg></a><a target=_blank rel="noopener noreferrer" aria-label="share Kotlin 技术月报 | 2024 年 12 月 on whatsapp" href="https://api.whatsapp.com/send?text=Kotlin%20%e6%8a%80%e6%9c%af%e6%9c%88%e6%8a%a5%20%7c%202024%20%e5%b9%b4%2012%20%e6%9c%88%20-%20https%3a%2f%2fbeijing-kug.github.io%2fnews%2fkotlin-news-2024-12%2f"><svg viewBox="0 0 512 512"><path d="M449.446.0C483.971.0 512 28.03 512 62.554v386.892C512 483.97 483.97 512 449.446 512H62.554c-34.524.0-62.554-28.03-62.554-62.554V62.554c0-34.524 28.029-62.554 62.554-62.554h386.892zm-58.673 127.703c-33.842-33.881-78.847-52.548-126.798-52.568-98.799.0-179.21 80.405-179.249 179.234-.013 31.593 8.241 62.428 23.927 89.612l-25.429 92.884 95.021-24.925c26.181 14.28 55.659 21.807 85.658 21.816h.074c98.789.0 179.206-80.413 179.247-179.243.018-47.895-18.61-92.93-52.451-126.81zM263.976 403.485h-.06c-26.734-.01-52.954-7.193-75.828-20.767l-5.441-3.229-56.386 14.792 15.05-54.977-3.542-5.637c-14.913-23.72-22.791-51.136-22.779-79.287.033-82.142 66.867-148.971 149.046-148.971 39.793.014 77.199 15.531 105.329 43.692 28.128 28.16 43.609 65.592 43.594 105.4-.034 82.149-66.866 148.983-148.983 148.984zm81.721-111.581c-4.479-2.242-26.499-13.075-30.604-14.571-4.105-1.495-7.091-2.241-10.077 2.241-2.986 4.483-11.569 14.572-14.182 17.562-2.612 2.988-5.225 3.364-9.703 1.12-4.479-2.241-18.91-6.97-36.017-22.23C231.8 264.15 222.81 249.484 220.198 245s-.279-6.908 1.963-9.14c2.016-2.007 4.48-5.232 6.719-7.847 2.24-2.615 2.986-4.484 4.479-7.472 1.493-2.99.747-5.604-.374-7.846-1.119-2.241-10.077-24.288-13.809-33.256-3.635-8.733-7.327-7.55-10.077-7.688-2.609-.13-5.598-.158-8.583-.158-2.986.0-7.839 1.121-11.944 5.604-4.105 4.484-15.675 15.32-15.675 37.364.0 22.046 16.048 43.342 18.287 46.332 2.24 2.99 31.582 48.227 76.511 67.627 10.685 4.615 19.028 7.371 25.533 9.434 10.728 3.41 20.492 2.929 28.209 1.775 8.605-1.285 26.499-10.833 30.231-21.295 3.732-10.464 3.732-19.431 2.612-21.298-1.119-1.869-4.105-2.99-8.583-5.232z"/></svg></a><a target=_blank rel="noopener noreferrer" aria-label="share Kotlin 技术月报 | 2024 年 12 月 on telegram" href="https://telegram.me/share/url?text=Kotlin%20%e6%8a%80%e6%9c%af%e6%9c%88%e6%8a%a5%20%7c%202024%20%e5%b9%b4%2012%20%e6%9c%88&amp;url=https%3a%2f%2fbeijing-kug.github.io%2fnews%2fkotlin-news-2024-12%2f"><svg viewBox="2 2 28 28"><path d="M26.49 29.86H5.5a3.37 3.37.0 01-2.47-1 3.35 3.35.0 01-1-2.47V5.48A3.36 3.36.0 013 3 3.37 3.37.0 015.5 2h21A3.38 3.38.0 0129 3a3.36 3.36.0 011 2.46V26.37a3.35 3.35.0 01-1 2.47 3.38 3.38.0 01-2.51 1.02zm-5.38-6.71a.79.79.0 00.85-.66L24.73 9.24a.55.55.0 00-.18-.46.62.62.0 00-.41-.17q-.08.0-16.53 6.11a.59.59.0 00-.41.59.57.57.0 00.43.52l4 1.24 1.61 4.83a.62.62.0 00.63.43.56.56.0 00.4-.17L16.54 20l4.09 3A.9.9.0 0021.11 23.15zM13.8 20.71l-1.21-4q8.72-5.55 8.78-5.55c.15.0.23.0.23.16a.18.18.0 010 .06s-2.51 2.3-7.52 6.8z"/></svg></a></div></footer></article></main><footer class=footer><span>&copy; 2025 <a href=https://beijing-kug.github.io/>北京 KUG</a></span>
<span>Powered by
<a href=https://gohugo.io/ rel="noopener noreferrer" target=_blank>Hugo</a> &
        <a href=https://github.com/adityatelange/hugo-PaperMod/ rel=noopener target=_blank>PaperMod</a></span></footer><a href=#top aria-label="go to top" title="Go to Top (Alt + G)" class=top-link id=top-link accesskey=g><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentcolor"><path d="M12 6H0l6-6z"/></svg></a><script>let menu=document.getElementById("menu");menu&&(menu.scrollLeft=localStorage.getItem("menu-scroll-position"),menu.onscroll=function(){localStorage.setItem("menu-scroll-position",menu.scrollLeft)}),document.querySelectorAll('a[href^="#"]').forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();var t=this.getAttribute("href").substr(1);window.matchMedia("(prefers-reduced-motion: reduce)").matches?document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView():document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView({behavior:"smooth"}),t==="top"?history.replaceState(null,null," "):history.pushState(null,null,`#${t}`)})})</script><script>var mybutton=document.getElementById("top-link");window.onscroll=function(){document.body.scrollTop>800||document.documentElement.scrollTop>800?(mybutton.style.visibility="visible",mybutton.style.opacity="1"):(mybutton.style.visibility="hidden",mybutton.style.opacity="0")}</script><script>document.getElementById("theme-toggle").addEventListener("click",()=>{document.body.className.includes("dark")?(document.body.classList.remove("dark"),localStorage.setItem("pref-theme","light")):(document.body.classList.add("dark"),localStorage.setItem("pref-theme","dark"))})</script></body></html>